Load packages and functions

library(EnhancedVolcano)
library(UCell)
library(ggpubr)
library(rstatix)
library(Seurat)
library(SingleCellExperiment)
library(harmony)
library(scDblFinder)
library(SeuratDisk)
library(SeuratWrappers)
library(assertthat)
library(tidyquant)
library(tidyverse)
library(viridis)
library(ComplexHeatmap)
library(Matrix)
library(tidyverse)
library(readxl)
library(broom)
library(ggbeeswarm)
library(RColorBrewer)
library(scCustomize)
library(SPATA2)
library(NICHES)
library(cowplot)
library(NICHES)
library(clusterProfiler)
library(biomaRt)

## load functions and colors
source("R/functions.R")

Extended Data Figure 6a - prepro

## add DAM signature
## DAM modules
## find human homologs
dams <- list("DAM"= data.frame("MGI.symbol"=c("Cts7","Lpl","Itgax","Spp1","Apoe","Csf1","Clec7a","Igf1","Axl","Ank","Cd63","Tyrobp","Ctsb","Ctsd","Ctsl","Cd9","Ctsz","Ccl6","Trem2")))
  dams <- bind_rows(dams, .id = "term")
  
  ## find homologs
  ensembl.human <-useMart("ensembl", dataset = "hsapiens_gene_ensembl", host = "https://dec2021.archive.ensembl.org/")   #useEnsembl("ensembl", dataset = "hsapiens_gene_ensembl")
  ensembl.mouse <- useMart("ensembl", dataset = "mmusculus_gene_ensembl", host = "https://dec2021.archive.ensembl.org/")  #useEnsembl("ensembl", dataset = "mmusculus_gene_ensembl")
  
  homologs = getLDS(attributes = c("mgi_symbol"), filters = "mgi_symbol", values = dams$MGI.symbol , mart = ensembl.mouse, attributesL = c("hgnc_symbol"), martL = ensembl.human, uniqueRows=T)
  dams <- dams %>% 
    left_join(homologs)
  
  dam_markers <- list("DAM"=homologs$HGNC.symbol[-7])

## set the module scores
immune_comb <- AddModuleScore(immune_comb, dam_markers, name = names( dam_markers))
Error: object 'immune_comb' not found

Figure panels Extended data Figure 6 a,b,d

signatures <- c("macrophages_UCell","microglia_UCell","G2M.Score", "S.Score","DAM_UCell")

walk(signatures, function(x) {
  plt <- FeaturePlot(immune_comb, x) +
    scale_color_distiller(palette = "Reds", direction = 1) +
    theme_void()
  print(plt)
})

ED Figure 6 c


## subset the object for myeloid clusters
myeloid <- immune_comb[, !immune_comb$seurat_clusters %in% c("16","11","15","19","17")]

Figure panels Extended data Figure 6 e

immune_comb$dataset2 <- factor(immune_comb$dataset, levels = c("Braun et al.","Yang et al.","Present study"))

DimPlot(immune_comb, label = T, pt.size = .5, group.by = "dataset2") +
  scale_color_brewer(palette = "Paired") +
  labs(title = element_blank()) +
  theme_void()

Extended Data Figure 6f

Extended Data Figure 6g

Extended Data Figure 6h

DimPlot(fetal, group.by = "compartment", label = T, pt.size = 1, repel = T) +
  scale_color_manual(values = unname(palette_dark())[c(1:2,4)]) +
  theme_void() +
  NoLegend() +
  labs(title = element_blank())


fetal[[]] %>% 
  mosaicGG2(X="seurat_clusters",FILL="compartment", colors = unname(palette_dark())[c(1:2,4)])

Extended Data Figure 6i

DimPlot(fetal, group.by = "timepoint", label = T, pt.size = 1, repel = T) +
  scale_color_brewer(palette = "Set2") +
  theme_void() +
  NoLegend() +
  labs(title = element_blank())


## plot timepoint marimekko
fetal[[]] %>% 
  mosaicGG2(X="seurat_clusters",FILL="timepoint") +
  scale_fill_brewer(palette = "Set2")

Roman Sankowski 03-10-2023 email:

LS0tCnRpdGxlOiAiRmlndXJlLWV4dGVuZGVkLWRhdGEtRmlndXJlLTYtY29kZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIExvYWQgcGFja2FnZXMgYW5kIGZ1bmN0aW9ucwpgYGB7ciBMb2FkIHBhY2thZ2VzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykKbGlicmFyeShVQ2VsbCkKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkocnN0YXRpeCkKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCmxpYnJhcnkoaGFybW9ueSkKbGlicmFyeShzY0RibEZpbmRlcikKbGlicmFyeShTZXVyYXREaXNrKQpsaWJyYXJ5KFNldXJhdFdyYXBwZXJzKQpsaWJyYXJ5KGFzc2VydHRoYXQpCmxpYnJhcnkodGlkeXF1YW50KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQpsaWJyYXJ5KE1hdHJpeCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGdnYmVlc3dhcm0pCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHNjQ3VzdG9taXplKQpsaWJyYXJ5KFNQQVRBMikKbGlicmFyeShOSUNIRVMpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShOSUNIRVMpCmxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKQpsaWJyYXJ5KGJpb21hUnQpCgojIyBsb2FkIGZ1bmN0aW9ucyBhbmQgY29sb3JzCnNvdXJjZSgiUi9mdW5jdGlvbnMuUiIpCmBgYAoKIyMjIEV4dGVuZGVkIERhdGEgRmlndXJlIDZhIC0gcHJlcHJvCmBgYHtyIEVEIEZpZ3VyZSA2YV9wcmVwcm9jZXNzLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CgppZiAoIWZpbGUuZXhpc3RzKGZpbGUucGF0aCgiZGF0YSIsImltbXVuZV9jb21iaW5lZF93aXRoX0JyYXVuX1lhbmdfZXRfYWwuSDVTZXVyYXQiKSkpIHsKICAjIyBnZW5lcmF0ZSB0aGUgaW1tdW5lIGNvbWJpbmVkIG9iamVjdAogIGltbXVuZV9saW4gPC0gTG9hZEg1U2V1cmF0KGZpbGUucGF0aCgiZGF0YSIsIkxpbm5hcnNzb25fZGV2ZWxvcG1lbnRhbCIsImltbXVuZV9zZXVyYXRfb2JqZWN0Lkg1U2V1cmF0IikpCiAgaW1tdW5lX2xpbiA8LSBpbW11bmVfbGluICU+JSAKICAgIFJ1blVNQVAoZGltcyA9IDE6MzApICU+JSAKICAgIEZpbmROZWlnaGJvcnMoZGltcyA9IDE6MzApICU+JSAKICAgIEZpbmRDbHVzdGVycygpCiAgbG9hZChmaWxlLnBhdGgoImRhdGEiLCJMaW5uYXJzc29uX2RldmVsb3BtZW50YWwiLCJtZXRhZGF0YV9MaW5uYXJzc29uX2ltbXVuZV9zdWJzZXRfZm9yX2F6aW11dGguUkRhdGEiKSkKICAKICBjcCA8LSBMb2FkSDVTZXVyYXQoZmlsZS5wYXRoKCJkYXRhIiwiWWFuZ19ldF9hbF9DUF9hbGxfY2VsbHMuSDVTZXVyYXQiKSkKICBjcF9pbW11bmUgPC0gc3Vic2V0KGNwLCBzdWJzZXQgPSBzZXVyYXRfY2x1c3RlcnMgPT0gIjkiKQogIAogIGltbXVuZSA8LSBzdWJzZXQoYWxsLCBzdWJzZXQ9IHNldXJhdF9jbHVzdGVycyAlaW4lIGMoIjkiLCIyMyIsIjEyIiwiMjIiLCIyNiIpKQogIGltbXVuZV9jb21iIDwtIG1lcmdlKGltbXVuZSwgbGlzdChpbW11bmVfbGluW3Jvd25hbWVzKGltbXVuZV9saW4pICVpbiUgcm93bmFtZXMoaW1tdW5lKSxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcF9pbW11bmUpKQogIGltbXVuZV9jb21iIDwtIGltbXVuZV9jb21iICU+JSAKICAgIE5vcm1hbGl6ZURhdGEoKSAlPiUgCiAgICBGaW5kVmFyaWFibGVGZWF0dXJlcyhuZmVhdHVyZXM9MTAwMDApICU+JSAKICAgIFNjYWxlRGF0YSh2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5tdCIpICU+JSAKICAgIFJ1blBDQSgpICU+JQogICAgUnVuSGFybW9ueShncm91cC5ieS52YXJzID0gImV4cGVyaW1lbnQiKSAlPiUgCiAgICBSdW5VTUFQKHJlZHVjdGlvbiA9ICJoYXJtb255IiwgZGltcyA9IDE6MzApICU+JSAKICAgIEZpbmROZWlnaGJvcnMocmVkdWN0aW9uID0gImhhcm1vbnkiLCBkaW1zID0gMTozMCkgJT4lIAogICAgRmluZENsdXN0ZXJzKCkKICBTYXZlSDVTZXVyYXQoaW1tdW5lX2NvbWIsIGZpbGUucGF0aCgiZGF0YSIsImltbXVuZV9jb21iaW5lZF93aXRoX0JyYXVuX1lhbmdfZXRfYWwuSDVTZXVyYXQiKSkKfSBlbHNlIHsKICBpbW11bmVfY29tYiA8LSBMb2FkSDVTZXVyYXQoZmlsZS5wYXRoKCJkYXRhIiwiaW1tdW5lX2NvbWJpbmVkX3dpdGhfQnJhdW5fWWFuZ19ldF9hbC5INVNldXJhdCIpKQp9CgojIyBzZXQgY2x1c3RlciBvcmRlcgojIyByZW9yZGVyIGNsdXN0ZXJzCm9yZGVyX2NsdXN0ZXJzIDwtIGRhdGEuZnJhbWUoc2V1cmF0X2NsdXN0ZXJzPSBpbW11bmVfY29tYiRzZXVyYXRfY2x1c3RlcnMsIHJvdy5uYW1lcyA9IHJvd25hbWVzKGltbXVuZV9jb21iW1tdXSkpICU+JQogIGJpbmRfY29scyhhcy5kYXRhLmZyYW1lKHQoaW1tdW5lX2NvbWJbWyJSTkEiXV1Ac2NhbGUuZGF0YSkpKSAlPiUKICBncm91cF9ieShzZXVyYXRfY2x1c3RlcnMpICU+JQogIHN1bW1hcml6ZV9hbGwoLmZ1bnM9bWVhbikgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgpyb3duYW1lcyhvcmRlcl9jbHVzdGVycykgPC0gb3JkZXJfY2x1c3RlcnMkc2V1cmF0X2NsdXN0ZXJzCm9yZGVyX2NsdXN0ZXJzIDwtIG9yZGVyX2NsdXN0ZXJzJHNldXJhdF9jbHVzdGVyc1toY2x1c3QoZGlzdChvcmRlcl9jbHVzdGVyc1ssLTFdKSkkb3JkZXJdCgojcmVvcmRlciB0aGUgY2x1c3RlcnMKbGV2ZWxzKGltbXVuZV9jb21iKSA8LSByZXYob3JkZXJfY2x1c3RlcnMpCmltbXVuZV9jb21iJHNldXJhdF9jbHVzdGVycyA8LSBmYWN0b3IoaW1tdW5lX2NvbWIkc2V1cmF0X2NsdXN0ZXJzLCBsZXZlbHMgPSBsZXZlbHMoaW1tdW5lX2NvbWIpKQoKIyMgYWRqdXN0IGNlbGwgdHlwZSBhc3NpZ25tZW50CiMjIHJlb3JkZXIgY2x1c3RlcnMKY29tcGFydG1lbnRfY29yIDwtIGNhc2Vfd2hlbihncmVwbCgiQ1AiLGltbXVuZV9jb21iJGNvbXBhcnRtZW50KSB+ICJDUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIjEzODAwIixpbW11bmVfY29tYiRQYXRfSUQpIH4gIkxNIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUfmltbXVuZV9jb21iJGNvbXBhcnRtZW50KQpuYW1lcyhjb21wYXJ0bWVudF9jb3IpIDwtIGNvbG5hbWVzKGltbXVuZV9jb21iKQppbW11bmVfY29tYiRjb21wYXJ0bWVudF9jb3IgPC0gZmFjdG9yKGNvbXBhcnRtZW50X2NvciwgbGV2ZWxzID0gYygiQ1AiLCJQQyIsIkxNIikpCgojIyBhZGQgZGF0YXNldAppbW11bmVfY29tYiRkYXRhc2V0IDwtIGNhc2Vfd2hlbihncmVwbCgiXkxpbm4iLCBpbW11bmVfY29tYiRleHBlcmltZW50KSB+ICJCcmF1biBldCBhbC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiWWFuZyIsIGltbXVuZV9jb21iJGV4cGVyaW1lbnQpIH4gIllhbmcgZXQgYWwuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+ICJQcmVzZW50IHN0dWR5IikKaW1tdW5lX2NvbWIkZGF0YXNldCA8LSBmYWN0b3IoaW1tdW5lX2NvbWIkZGF0YXNldCwgbGV2ZWxzID0gYygiQnJhdW4gZXQgYWwuIiwiWWFuZyBldCBhbC4iLCJQcmVzZW50IHN0dWR5IikpCgojIyBhZGQgdGltZXBvaW50CnRpbWVwb2ludF9jb3IgPC0gY2FzZV93aGVuKGltbXVuZV9jb21iJHRpbWVwb2ludCA9PSAiQ1MyMSIgfiAiNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXVuZV9jb21iJHRpbWVwb2ludCA9PSAiQ1MyMyIgfiAiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBpbW11bmVfY29tYiR0aW1lcG9pbnQpCiAgCnRpbWVwb2ludF9jb3IgPC0gZ3N1YigicGN3IiwiIix0aW1lcG9pbnRfY29yKQpuYW1lcyh0aW1lcG9pbnRfY29yKSA8LSBjb2xuYW1lcyhpbW11bmVfY29tYikKCmltbXVuZV9jb21iJHRpbWVwb2ludF9jb3IgPC0gZHJvcGxldmVscyhmYWN0b3IodGltZXBvaW50X2NvciwgbGV2ZWxzPSBjKGFzLmNoYXJhY3Rlcig1OjIzKSwicG9zdG5hdGFsIikpKQoKIyMgZGVmaW5lIGNsdXN0ZXIgY29sb3JzCmNsdXN0X2NvbG9ycyA8LSBjKGNvbG9yc19tYW55LCBjb2xvcnNfZmlnKVstYygxNCwyMSldWzE6bGVuZ3RoKGxldmVscyhpbW11bmVfY29tYikpXQpuYW1lcyhjbHVzdF9jb2xvcnMpIDwtIGxldmVscyhpbW11bmVfY29tYikKCiMjIGFkZCBEQU0gc2lnbmF0dXJlCiMjIERBTSBtb2R1bGVzCiMjIGZpbmQgaHVtYW4gaG9tb2xvZ3MKZGFtcyA8LSBsaXN0KCJEQU0iPSBkYXRhLmZyYW1lKCJNR0kuc3ltYm9sIj1jKCJDdHM3IiwiTHBsIiwiSXRnYXgiLCJTcHAxIiwiQXBvZSIsIkNzZjEiLCJDbGVjN2EiLCJJZ2YxIiwiQXhsIiwiQW5rIiwiQ2Q2MyIsIlR5cm9icCIsIkN0c2IiLCJDdHNkIiwiQ3RzbCIsIkNkOSIsIkN0c3oiLCJDY2w2IiwiVHJlbTIiKSkpCiAgZGFtcyA8LSBiaW5kX3Jvd3MoZGFtcywgLmlkID0gInRlcm0iKQogIAogICMjIGZpbmQgaG9tb2xvZ3MKICBlbnNlbWJsLmh1bWFuIDwtdXNlTWFydCgiZW5zZW1ibCIsIGRhdGFzZXQgPSAiaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgaG9zdCA9ICJodHRwczovL2RlYzIwMjEuYXJjaGl2ZS5lbnNlbWJsLm9yZy8iKSAgICN1c2VFbnNlbWJsKCJlbnNlbWJsIiwgZGF0YXNldCA9ICJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiKQogIGVuc2VtYmwubW91c2UgPC0gdXNlTWFydCgiZW5zZW1ibCIsIGRhdGFzZXQgPSAibW11c2N1bHVzX2dlbmVfZW5zZW1ibCIsIGhvc3QgPSAiaHR0cHM6Ly9kZWMyMDIxLmFyY2hpdmUuZW5zZW1ibC5vcmcvIikgICN1c2VFbnNlbWJsKCJlbnNlbWJsIiwgZGF0YXNldCA9ICJtbXVzY3VsdXNfZ2VuZV9lbnNlbWJsIikKICAKICBob21vbG9ncyA9IGdldExEUyhhdHRyaWJ1dGVzID0gYygibWdpX3N5bWJvbCIpLCBmaWx0ZXJzID0gIm1naV9zeW1ib2wiLCB2YWx1ZXMgPSBkYW1zJE1HSS5zeW1ib2wgLCBtYXJ0ID0gZW5zZW1ibC5tb3VzZSwgYXR0cmlidXRlc0wgPSBjKCJoZ25jX3N5bWJvbCIpLCBtYXJ0TCA9IGVuc2VtYmwuaHVtYW4sIHVuaXF1ZVJvd3M9VCkKICBkYW1zIDwtIGRhbXMgJT4lIAogICAgbGVmdF9qb2luKGhvbW9sb2dzKQogIAogIGRhbV9tYXJrZXJzIDwtIGxpc3QoIkRBTSI9aG9tb2xvZ3MkSEdOQy5zeW1ib2xbLTddKQoKIyMgc2V0IHRoZSBtb2R1bGUgc2NvcmVzCmltbXVuZV9jb21iIDwtIEFkZE1vZHVsZVNjb3JlKGltbXVuZV9jb21iLCBkYW1fbWFya2VycywgbmFtZSA9IG5hbWVzKCBkYW1fbWFya2VycykpCmhvbWluZ19zY29yZXMgPC0gU2NvcmVTaWduYXR1cmVzX1VDZWxsKGltbXVuZV9jb21iW1siUk5BIl1dQGNvdW50cywgZmVhdHVyZXM9IGRhbV9tYXJrZXJzKQppbW11bmVfY29tYiA8LSBBZGRNZXRhRGF0YShpbW11bmVfY29tYiwgYXMuZGF0YS5mcmFtZShob21pbmdfc2NvcmVzKSkKCmBgYAojIyMgRmlndXJlIHBhbmVscyBFeHRlbmRlZCBkYXRhIEZpZ3VyZSA2IGEsYixkCmBgYHtyIEVEIEZpZ3VyZSA2YS1iLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpzaWduYXR1cmVzIDwtIGMoIm1hY3JvcGhhZ2VzX1VDZWxsIiwibWljcm9nbGlhX1VDZWxsIiwiRzJNLlNjb3JlIiwgIlMuU2NvcmUiLCJEQU1fVUNlbGwiKQoKd2FsayhzaWduYXR1cmVzLCBmdW5jdGlvbih4KSB7CiAgcGx0IDwtIEZlYXR1cmVQbG90KGltbXVuZV9jb21iLCB4KSArCiAgICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZWRzIiwgZGlyZWN0aW9uID0gMSkgKwogICAgdGhlbWVfdm9pZCgpCiAgcHJpbnQocGx0KQp9KQoKYGBgCiMjIyBFRCBGaWd1cmUgNiBjCmBgYHtyIEVEIEZpZ3VyZSA2Yywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCiMjIHN1YnNldCB0aGUgb2JqZWN0IGZvciBteWVsb2lkIGNsdXN0ZXJzCm15ZWxvaWQgPC0gaW1tdW5lX2NvbWJbLCAhaW1tdW5lX2NvbWIkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiMTYiLCIxMSIsIjE1IiwiMTkiLCIxNyIpXQoKIyMgYWRqdXN0IG1ldGFkYXRhCm15ZWxvaWQkdGltZXBvaW50X2NvciA8LSBkcm9wbGV2ZWxzKGZhY3Rvcih0aW1lcG9pbnRfY29yLCBsZXZlbHM9IGMoYXMuY2hhcmFjdGVyKDU6MjMpLCJwb3N0bmF0YWwiKSkpCgpjZWxsdHlwZV9jb3IgPC0gY2FzZV93aGVuKG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiNyIsIjEiLCIyIiwiMTQiLCIzIiwiMTIiLCI2IiwiNSIsIjQiKSAmIG15ZWxvaWQkY29tcGFydG1lbnRfY29yICE9IkNQIiB+ICJNRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXllbG9pZCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCI3IiwiMSIsIjIiLCIxNCIsIjMiLCIxMiIsIjYiLCI1IiwiNCIpICYgbXllbG9pZCRjb21wYXJ0bWVudF9jb3IgPT0iQ1AiIH4gIktvbG1lciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXllbG9pZCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCIxMyIsIjAiLCIxMCIsIjE4IikgIH4gIkNBTXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiOCIpICAmIG15ZWxvaWQkY29tcGFydG1lbnRfY29yID09IkNQIiB+ICJLb2xtZXIgY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiOCIpICB+ICJNRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXllbG9pZCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCI5IikgJiBteWVsb2lkJG1hY3JvcGhhZ2VzX1VDZWxsID4gLjEgIH4gIkNBTXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiOSIpICYgbXllbG9pZCRtaWNyb2dsaWFfVUNlbGwgPiAuMSAgfiAiTUciLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiOSIpICB+ICJPdGhlciBwcm9saWYuIGNlbGxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBteWVsb2lkJHNldXJhdF9jbHVzdGVycyA9PSAiMTYiIH4gIkIgY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzID09ICIxNSIgfiAiVCBjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXllbG9pZCRzZXVyYXRfY2x1c3RlcnMgPT0gIjExIiB+ICJOSyBjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXllbG9pZCRzZXVyYXRfY2x1c3RlcnMgPT0gIjE3IiB+ICJNb25vY3l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzID09ICIxOSIgfiAiUGxhdGVsZXRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gIm90aGVyIikKCm5hbWVzKGNlbGx0eXBlX2NvcikgPC0gY29sbmFtZXMobXllbG9pZCkKbXllbG9pZCRjZWxsdHlwZV9jb3IgPC0gY2VsbHR5cGVfY29yCgpJZGVudHMobXllbG9pZCkgPC0gbXllbG9pZCR0aW1lcG9pbnRfY29yCgpteWVsb2lkIDwtIHN1YnNldChteWVsb2lkLCBzdWJzZXQgPSBjZWxsdHlwZV9jb3IgJWluJSBjKCJDQU1zIiwiTUciLCJLb2xtZXIgY2VsbHMiKSkKbXllbG9pZCRjZWxsdHlwZV9jb3IgPC0gZmFjdG9yKG15ZWxvaWQkY2VsbHR5cGVfY29yLCBsZXZlbHMgPSBjKCJDQU1zIiwiTUciLCJLb2xtZXIgY2VsbHMiKSkKCiMjIGJ1bGsgaGVhdG1hcHMgZm9yIHRoZSBjYW0gYW5kIG1pY3JvZ2xpYSBnZW5lcwpJZGVudHMobXllbG9pZCkgPC0gZHJvcGxldmVscyhteWVsb2lkJHNldXJhdF9jbHVzdGVycykKbGV2ZWxzKG15ZWxvaWQpIDwtIGxldmVscyhkcm9wbGV2ZWxzKG15ZWxvaWQkc2V1cmF0X2NsdXN0ZXJzKSkKCiMjIGZpbmQgbWFya2VycwppZiAoIWZpbGUuZXhpc3RzKGZpbGUucGF0aCgiZGF0YSIsImhkYnJfbXllbG9pZF9jZWxsX21hcmtlcnMuUkRhdGEiKSkpIHsKICBteWVsb2lkX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMobXllbG9pZCkgCiAgICAKICBzYXZlKG15ZWxvaWRfbWFya2VycywgZmlsZSA9IGZpbGUucGF0aCgiZGF0YSIsImhkYnJfbXllbG9pZF9jZWxsX21hcmtlcnMuUkRhdGEiKSkKfSBlbHNlIHsKICBsb2FkKGZpbGUucGF0aCgiZGF0YSIsImhkYnJfbXllbG9pZF9jZWxsX21hcmtlcnMuUkRhdGEiKSkKfQoKdG9wNyA8LSBteWVsb2lkX21hcmtlcnMgJT4lIAogIGZpbHRlcihhdmdfbG9nMkZDPjApICU+JSAKICBncm91cF9ieShjbHVzdGVyKSAlPiUgCiAgdG9wX24oNywgd3QgPSBhdmdfbG9nMkZDKQogIAptZWFuX2V4cHIgPC0gZGF0YS5mcmFtZSh0KGFzLm1hdHJpeChteWVsb2lkW1siUk5BIl1dQGRhdGFbdW5pcXVlKHRvcDckZ2VuZSksXSkpLCAiY2x1c3RlciI9bXllbG9pZCRzZXVyYXRfY2x1c3RlcnMpICU+JSAgCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIAogIHN1bW1hcmlzZV9hbGwoLmZ1bnMgPSBtZWFuKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpCgpyb3duYW1lcyhtZWFuX2V4cHIpIDwtIG1lYW5fZXhwciRjbHVzdGVyCm1lYW5fZXhwciRjbHVzdGVyIDwtIE5VTEwKCm1hdCA8LSBzY2FsZShhcy5tYXRyaXgobWVhbl9leHByKSkKSGVhdG1hcChtYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gVCwgCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICJhdmVyYWdlIiwKICAgICAgICB3aWR0aCA9IG5jb2wobWF0KSp1bml0KDUsICJtbSIpLCAKICAgICAgICBoZWlnaHQgPSBucm93KG1hdCkqdW5pdCg1LCAibW0iKSkKCmBgYAoKYGBge3Igc291cmNlIGRhdGEgRUQgRjRjLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KCndyaXRlLmNzdihtYXQsIGZpbGUucGF0aCgiZGF0YSIsInNvdXJjZV9kYXRhIiwicGFuZWxzX0VEX0ZpZ182X2MuY3N2IikpCmBgYAoKCiMjIyBGaWd1cmUgcGFuZWxzIEV4dGVuZGVkIGRhdGEgRmlndXJlIDYgZQpgYGB7ciBFRCBGaWd1cmUgNmUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmltbXVuZV9jb21iJGRhdGFzZXQyIDwtIGZhY3RvcihpbW11bmVfY29tYiRkYXRhc2V0LCBsZXZlbHMgPSBjKCJCcmF1biBldCBhbC4iLCJZYW5nIGV0IGFsLiIsIlByZXNlbnQgc3R1ZHkiKSkKCkRpbVBsb3QoaW1tdW5lX2NvbWIsIGxhYmVsID0gVCwgcHQuc2l6ZSA9IC41LCBncm91cC5ieSA9ICJkYXRhc2V0MiIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgbGFicyh0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lX3ZvaWQoKQoKYGBgCgpgYGB7ciBzb3VyY2UgZGF0YSBFRDZhYmRlLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KZGYgPC0gZGF0YS5mcmFtZSgiVU1BUF8xIj1pbW11bmVfY29tYkByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzWywxXSwKICAgICAgICAgICAgICAgICAiVU1BUF8yIj1pbW11bmVfY29tYkByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzWywyXSwKICAgICAgICAgICAgICAgICAiRGF0YXNldCI9aW1tdW5lX2NvbWIkZGF0YXNldDIsCiAgICAgICAgICAgICAgICAgaW1tdW5lX2NvbWJbW11dWyxzaWduYXR1cmVzXSkKd3JpdGUuY3N2KGRmLCBmaWxlLnBhdGgoImRhdGEiLCJzb3VyY2VfZGF0YSIsInBhbmVsc19FRF9GaWdfNmFfYl9kX2UuY3N2IikpCmBgYAoKIyMjIEV4dGVuZGVkIERhdGEgRmlndXJlIDZmCmBgYHtyIEVEIEZpZ3VyZSA2Ziwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCiMjIHBsb3QgbXllbG9pZCBudWMgc2VxIHNpZ25hdHVyZXMKbXllbG9pZF9udWMgPC0gbXllbG9pZFssIW15ZWxvaWQkZXhwZXJpbWVudCAlaW4lIGMoIkxpbm5hc3Nvbl92MiIsIkxpbm5hc3Nvbl92MyIpXQoKIyMgbWljcm9nbGlhIHNpZ25hdHVyZSAKbWdfY29yIDwtIG15ZWxvaWRfbnVjW1tdXSAlPiUgCiAgZ3JvdXBfYnkoUGF0X0lELCBjZWxsdHlwZV9jb3IsIC5kcm9wID0gRikgJT4lIAogIG11dGF0ZShjZWxsY291bnQ9bigpLAogICAgICAgICBtZWFuX2RhbT1tZWFuKG1pY3JvZ2xpYV9VQ2VsbCwgbmEucm09VCkpICU+JSAKICBkaXN0aW5jdChQYXRfSUQsIGNlbGx0eXBlX2NvciwgLmtlZXBfYWxsID0gVCkgJT4lIAogIGZpbHRlcihjZWxsY291bnQ+MSkgCgptZ19jb3IgJT4lIAogIGdncGxvdChhZXModGltZXBvaW50LG1lYW5fZGFtLCBncm91cD1jZWxsdHlwZV9jb3IpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9Y29tcGFydG1lbnRfY29yKSwgc2l6ZT01LCBhbHBoYT0uNSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGx3ZD0zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNsdXN0X2NvbG9yc1tsZXZlbHMobXllbG9pZF9udWMkc2V1cmF0X2NsdXN0ZXJzKV0pICsKICB0aGVtZV9saW5lZHJhdygpICsKICBOb0xlZ2VuZCgpICsKICBsYWJzKHk9IkV4cHJlc3Npb24iLHg9IkNsdXN0ZXIiLHRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZSA9IDQ1LHZqdXN0ID0gMSxoanVzdCA9IDEpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZmFjZXRfd3JhcCh+Y2VsbHR5cGVfY29yKSArCiAgc3RhdF9jb3Ioc2l6ZT01LCBsYWJlbC55PS4yOSkgKwogIGV4cGFuZF9saW1pdHMoeT1jKDAsLjMpKQogCgojIyBtYWNyb3BoYWdlIHNpZ25hdHVyZSAKZGFtX2NvciA8LSBteWVsb2lkX251Y1tbXV0gJT4lIAogIGdyb3VwX2J5KFBhdF9JRCwgY2VsbHR5cGVfY29yLCAuZHJvcCA9IEYpICU+JSAKICBtdXRhdGUoY2VsbGNvdW50PW4oKSwKICAgICAgICAgbWVhbl9kYW09bWVhbihEQU1fVUNlbGwsIG5hLnJtPVQpKSAlPiUgCiAgZGlzdGluY3QoUGF0X0lELCBjZWxsdHlwZV9jb3IsIC5rZWVwX2FsbCA9IFQpICU+JSAKICBmaWx0ZXIoY2VsbGNvdW50PjEpIApkYW1fY29yICU+JSAKICBnZ3Bsb3QoYWVzKHRpbWVwb2ludCxtZWFuX2RhbSwgZ3JvdXA9Y2VsbHR5cGVfY29yKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPWNvbXBhcnRtZW50X2NvciksIHNpemU9NSwgYWxwaGE9LjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsd2Q9MykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjbHVzdF9jb2xvcnNbbGV2ZWxzKG15ZWxvaWRfbnVjJHNldXJhdF9jbHVzdGVycyldKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgTm9MZWdlbmQoKSArCiAgbGFicyh5PSJFeHByZXNzaW9uIix4PSJDbHVzdGVyIix0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCggYW5nbGUgPSA0NSx2anVzdCA9IDEsaGp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGZhY2V0X3dyYXAofmNlbGx0eXBlX2NvcikgKwogIHN0YXRfY29yKHNpemU9NSwgbGFiZWwueT0uMjkpICsKICBleHBhbmRfbGltaXRzKHk9YygwLC4zKSkKCgpgYGAKYGBge3Igc291cmNlIGRhdGEgRUQgRjZmX3RvcCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CndyaXRlLmNzdihkYW1fY29yWyxjKCJtZWFuX2RhbSIsIlBhdF9JRCIsInRpbWVwb2ludCIpXSwgZmlsZS5wYXRoKCJkYXRhIiwic291cmNlX2RhdGEiLCJwYW5lbHNfRURfRmlnXzZfZl90b3AuY3N2IikpCndyaXRlLmNzdihtZ19jb3JbLGMoIm1lYW5fZGFtIiwiUGF0X0lEIiwidGltZXBvaW50IildLCBmaWxlLnBhdGgoImRhdGEiLCJzb3VyY2VfZGF0YSIsInBhbmVsc19FRF9GaWdfNl9mX2JvdHRvbS5jc3YiKSkKYGBgCgojIyMgRXh0ZW5kZWQgRGF0YSBGaWd1cmUgNmcKYGBge3IgRUQgRmlndXJlIDZnIHByZXByb2Nlc3MsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KIyMjIGxvYWQgbXVsdGkgb21pY3MgZmV0YWwgZGF0YQpmZXRhbCA8LSBMb2FkSDVTZXVyYXQoZmlsZS5wYXRoKCJkYXRhIiwicmVmZXJlbmNlX21hcHBlZF9mZXRhbC5INVNldXJhdCIpKQoKIyMgYWRqdXN0IGNsdXN0ZXIgb3JkZXIKb3JkZXJfY2x1c3RlcnMgPC0gZGF0YS5mcmFtZShzZXVyYXRfY2x1c3RlcnM9IGZldGFsJHNldXJhdF9jbHVzdGVycywgcm93Lm5hbWVzID0gcm93bmFtZXMoZmV0YWxbW11dKSkgJT4lCiAgYmluZF9jb2xzKGFzLmRhdGEuZnJhbWUodChmZXRhbFtbIlNDVCJdXUBzY2FsZS5kYXRhKSkpICU+JQogIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycykgJT4lCiAgc3VtbWFyaXplX2FsbCguZnVucz1tZWFuKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKCnJvd25hbWVzKG9yZGVyX2NsdXN0ZXJzKSA8LSBvcmRlcl9jbHVzdGVycyRzZXVyYXRfY2x1c3RlcnMKb3JkZXJfY2x1c3RlcnMgPC0gb3JkZXJfY2x1c3RlcnMkc2V1cmF0X2NsdXN0ZXJzW2hjbHVzdChkaXN0KG9yZGVyX2NsdXN0ZXJzWywtMV0pKSRvcmRlcl0KCiNyZW9yZGVyIHRoZSBjbHVzdGVycwpsZXZlbHMoZmV0YWwpIDwtIHJldihvcmRlcl9jbHVzdGVycykKZmV0YWwkc2V1cmF0X2NsdXN0ZXJzIDwtIGZhY3RvcihmZXRhbCRzZXVyYXRfY2x1c3RlcnMsIGxldmVscyA9IGxldmVscyhmZXRhbCkpCgojIyBhZGp1c3QgY2VsbCB0eXBlcwpjZWxsdHlwZV9jb3IgPC0gY2FzZV93aGVuKAogIGZldGFsJHNldXJhdF9jbHVzdGVycyA9PSAiMTIiIH4gIk5ldXJvZWN0b2Rlcm1hbCIsCiAgZmV0YWwkc2V1cmF0X2NsdXN0ZXJzID09ICI1IiB+ICJCIGNlbGxzIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCI3IikgfiAiQ0FNcyIsCiAgZmV0YWwkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygiMiIpIH4gImNEQzIgJiBtb01GIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCIxIiwiMCIsIjkiLCIxMSIpICYgZmV0YWwkY29tcGFydG1lbnQgPT0gIkNQIiB+ICJLb2xtZXIgY2VsbHMiLAogIGZldGFsJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoIjEiLCIwIiwiOSIsIjExIikgJiBmZXRhbCRjb21wYXJ0bWVudCAhPSAiQ1AiIH4gIk1HIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCIxMCIsIjYiLCI4IikgfiAiQ2xhc3MuIE1vbm8iLAogIGZldGFsJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoIjE0IikgfiAibW9NRiIsCiAgZmV0YWwkc2V1cmF0X2NsdXN0ZXJzID09ICIxNSIgfiAiTm9uLUNsYXNzLiBNb25vIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgPT0gIjE2IiAmIGZldGFsJG1pY3JvZ2xpYV9VQ2VsbCA+IC4yNSB+ICJQcm9saWYuIE1HIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgPT0gIjE2IiAmIGZldGFsJG1hY3JvcGhhZ2VzX1VDZWxsID4gLjI1IH4gIlByb2xpZi4gQ0FNcyIsCiAgZmV0YWwkc2V1cmF0X2NsdXN0ZXJzID09ICIxNiIgfiAiT3RoZXIgcHJvbGlmLiBjZWxsIiwKICBmZXRhbCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKCIzIikgfiAiTksiLAogIGZldGFsJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoIjEzIiwiNCIpIH4gIlQgY2VsbHMiLAogIGZldGFsJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoIjE3IikgfiAicERDcyIsCiAgVCB+IGZldGFsJHByZWRpY3RlZC5jZWxsdHlwZQopCm5hbWVzKGNlbGx0eXBlX2NvcikgPC0gY29sbmFtZXMoZmV0YWwpCmZldGFsJGNlbGx0eXBlX2NvciA8LSBjZWxsdHlwZV9jb3IKCiMjIHNldCBjb21wYXJ0bWVudCBhcyBmYWN0b3IKZmV0YWwkY29tcGFydG1lbnQgPC0gZmFjdG9yKGZldGFsJGNvbXBhcnRtZW50LCBsZXZlbHMgPSBjKCJDUCIsIkNUWCIsIkxNIikpCmxldmVscyhmZXRhbCRjb21wYXJ0bWVudCkgPC0gYygiQ1AiLCJQQyIsIkxNIikKCiMjIHBsb3QgY2x1c3RlcnMKRGltUGxvdChmZXRhbCwgbGFiZWwgPSBULCBwdC5zaXplID0gMSwgcmVwZWwgPSBUKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JzX21hbnksIGNvbG9ycyx1bm5hbWUocGFsZXR0ZV9ncmVlbigpKSlbLWMoMTQsMjEsMjgpXSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgTm9MZWdlbmQoKSArCiAgbGFicyh0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAojIyMgRXh0ZW5kZWQgRGF0YSBGaWd1cmUgNmgKYGBge3IgRUQgRmlndXJlIDZoLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CkRpbVBsb3QoZmV0YWwsIGdyb3VwLmJ5ID0gImNvbXBhcnRtZW50IiwgbGFiZWwgPSBULCBwdC5zaXplID0gMSwgcmVwZWwgPSBUKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHVubmFtZShwYWxldHRlX2RhcmsoKSlbYygxOjIsNCldKSArCiAgdGhlbWVfdm9pZCgpICsKICBOb0xlZ2VuZCgpICsKICBsYWJzKHRpdGxlID0gZWxlbWVudF9ibGFuaygpKQoKZmV0YWxbW11dICU+JSAKICBtb3NhaWNHRzIoWD0ic2V1cmF0X2NsdXN0ZXJzIixGSUxMPSJjb21wYXJ0bWVudCIsIGNvbG9ycyA9IHVubmFtZShwYWxldHRlX2RhcmsoKSlbYygxOjIsNCldKQpgYGAKCiMjIyBFeHRlbmRlZCBEYXRhIEZpZ3VyZSA2aQpgYGB7ciBFRCBGaWd1cmUgNmksIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KRGltUGxvdChmZXRhbCwgZ3JvdXAuYnkgPSAidGltZXBvaW50IiwgbGFiZWwgPSBULCBwdC5zaXplID0gMSwgcmVwZWwgPSBUKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV92b2lkKCkgKwogIE5vTGVnZW5kKCkgKwogIGxhYnModGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCgojIyBwbG90IHRpbWVwb2ludCBtYXJpbWVra28KZmV0YWxbW11dICU+JSAKICBtb3NhaWNHRzIoWD0ic2V1cmF0X2NsdXN0ZXJzIixGSUxMPSJ0aW1lcG9pbnQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikKYGBgCmBgYHtyIHNvdXJjZSBkYXRhIEVENmdoaSwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmRmIDwtIGRhdGEuZnJhbWUoIlVNQVBfMSI9ZmV0YWxAcmVkdWN0aW9ucyR1bWFwQGNlbGwuZW1iZWRkaW5nc1ssMV0sCiAgICAgICAgICAgICAgICAgIlVNQVBfMiI9ZmV0YWxAcmVkdWN0aW9ucyR1bWFwQGNlbGwuZW1iZWRkaW5nc1ssMl0sCiAgICAgICAgICAgICAgICAgIkNsdXN0ZXIiPWZldGFsJHNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgICAgICAiQ2VsbHR5cGUiPWZldGFsJGNlbGx0eXBlX2NvciwKICAgICAgICAgICAgICAgICAiVGltZXBvaW50Ij1mZXRhbCR0aW1lcG9pbnQsCiAgICAgICAgICAgICAgICAgIkNvbXBhcnRtZW50Ij1mZXRhbCRjb21wYXJ0bWVudCkKd3JpdGUuY3N2KGRmLCBmaWxlLnBhdGgoImRhdGEiLCJzb3VyY2VfZGF0YSIsInBhbmVsc19FRF9GaWdfNmdfaF9pLmNzdiIpKQpgYGAKCgoKUm9tYW4gU2Fua293c2tpCjAzLTEwLTIwMjMKZW1haWw6IHJvbWFuLnNhbmtvd3NraUB1bmlrbGluaWstZnJlaWJ1cmcuZGU=